package com.jiazhong.filters;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Auther:shuXin 实现过滤器的接口
 * 重写do filter 的方法
 * 在web.xml中配置过滤器
 * 使用注解配置过滤器
 */
@WebFilter(
        filterName = "filterA",
        initParams = {@WebInitParam(name="dateTimePattern",value="yyyy-MM-dd HH:mm:ss")},
        urlPatterns = "/*",
        servletNames = {"servletAName"}
)
public class FilterAA implements Filter {
    //进行时间的格式化
    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化方法");
    }

    /**
     * 过滤请求和响应的方法
     * 1.请求到达目标资源之前，先经过该方法
     * 2.该方法有能力控制请求是否继续向后到达目标资源，可以在该方法内直接向客户端做响应处理
     * 3.请求到达目标资源之后，响应之前，还会经过该方法
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //进行父子类中的转换
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //定义日志中的拼接信息
        String requestURI = request.getRequestURI();
        String date = format.format(new Date());
        String beforeLogging = requestURI + "在" + date + "被请求了";
        //打印日志
        System.out.println(beforeLogging);
        //开始的时间
        long start = System.currentTimeMillis();
        //资源进行放行，放行的时间
        filterChain.doFilter(request, response);
        //结束的时间
        long end = System.currentTimeMillis();
        String afterLogging = requestURI + "在" + date + "的请求耗时为" + (end - start) + "毫秒";
        System.out.println(afterLogging);
    }

    @Override
    public void destroy() {
        System.out.println("销毁的方法");
    }
}
